package cn.echoparrot.domain.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import lombok.experimental.Accessors;

import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.util.Assert;

import java.time.LocalDateTime;

/**
 * 在构造函数中，将id设为long类型，并使用@GeneratedValue注解，表示id会自动生成。
 * 新Notebook对象不需要传入id，系统会自动生成。
 */
@Node("Notebook")
@Accessors(fluent = true)
@Builder
@Getter
@ToString
@EqualsAndHashCode
public class Notebook {
    @Id
    @GeneratedValue
    @JsonProperty
    private Long id;

    @JsonProperty
    private String deviceId;
    @JsonProperty
    private int roleId;
    @JsonProperty
    private int modelId;
    @JsonProperty
    private LocalDateTime createdAt;

    /**
     * 准入资格检查，检查notebook对象是否符合要求
     * 如是不符合要求，则抛出异常
     * @param notebook
     */
    public static void eligible(Notebook notebook) {
        Assert.notNull(notebook, "notebook must not be null");
        Assert.hasText(notebook.deviceId(), "deviceId must not be null");
        Assert.state(notebook.roleId()>0, "roleId must not be null");
        Assert.state(notebook.modelId()>0, "modelId must not be null");
    }

    public String indexName(){
        return  "vector_idx_Note_embedding_" + modelId;
    }

    public String labelName(){
        return "Note_" + modelId;
    }

    // 比较好的确定Note 的唯一性的，应该是DeviceID +时间戳，因为同一个设备不能同时在线。
    // 另外则是创建时给予一个固定的数字型ID是更合适的， 太长的字符串ID对性能有影响。
    // 用创建时的一次性的生成ID的开销，换取后续使用过程中的简便性，还是值得的。特别是像设备这样的小表。
    public String constraintName(){
        return "Note_unique_id_"+modelId;
    }
}